package com.gblfy.qywxin.service;

import com.gblfy.qywxin.config.QywxInnerConfig;
import com.gblfy.qywxin.utils.RestUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.Map;

/**
 * H5统一管理逻辑处理类
 *
 * @author gblfy
 * @date 2022-01-12
 */
@Service
public class QywxInnerH5Service {
    private static final Logger logger = LoggerFactory.getLogger(QywxInnerH5Service.class);

    @Value("${qywx.h5.agentSecret}")
    private String AGENT_SECRET;

    //********************************** H5应用 Oauth   *************************//

    /**
     * 组装企微回调前端url
     *
     * @param corpId 企业ID
     * @param url    回调url后缀
     * @return
     */
    public String getOauthUrl(String corpId, String url) {
        /**
         * 应用授权作用域
         *  snsapi_base：静默授权，可获取成员的基础信息（UserId与DeviceId）
         *  snsapi_userinfo：静默授权，可获取成员的详细信息，但不包含手机、邮箱等敏感信息
         *  snsapi_privateinfo：手动授权，可获取成员的详细信息，包含手机、邮箱等敏感信息（已不再支持获取手机号/邮箱）
         */
        return String.format(QywxInnerConfig.OAUTH_URL, corpId, url, "gblfy");
    }

    /**
     * 通过corpId（企业ID）、企微回传code获取用户详情信息
     *
     * @param corpId 企业ID
     * @param code   企微回传code
     * @return
     */
    public Map getOauthUser(String corpId, String code) {

        // 1.通过corpId获取AccessToken
        String accessToken = getAccessToken(corpId);

        String getOauthUrl = String.format(QywxInnerConfig.OAUTH_USER_URL, accessToken, code);
        Map response = RestUtils.get(getOauthUrl);
        if (response.containsKey("errcode") && (Integer) response.get("errcode") != 0) {
            logger.error(response.toString());
            return response;
        }

        //  目前已经获取到userid了
        //  return  response;


        //根据用户UserId->获取通讯录用户详情get
        String userId = (String) response.get("UserId");
        String url = String.format(QywxInnerConfig.USER_DETAIL_URL, accessToken, userId);
        Map detaiResponse = RestUtils.get(url);

        //获取错误日志
        if (detaiResponse.containsKey("errcode") && (Integer) detaiResponse.get("errcode") != 0) {
            logger.error(detaiResponse.toString());
        }
        return detaiResponse;
    }

    /**
     * 通过corpId获取AccessToken
     *
     * @param corpId 企业ID
     * @return
     */
    public String getAccessToken(String corpId) {
        String result = "";

        String accessTokenUrl = String.format(QywxInnerConfig.ACCESS_TOKEN_URL, corpId, AGENT_SECRET);
        Map response = RestUtils.get(accessTokenUrl);

        //获取错误日志
        if (response.containsKey("errcode") && (Integer) response.get("errcode") != 0) {
            logger.error(response.toString());
        } else {
            result = (String) response.get("access_token");
        }
        return result;
    }
}
